package elven.codingit.easyutil.date;

import java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.format.DateTimeFormat;

import elven.codingit.easyutil.common.Utils;

/**
 * 日期操作工具类
 * 获取当前日期，格式化日期字符串等日期操作工具类
 * @author elven 2016年5月22日
 */
public class DateUtils {

	public static String formate_YYYYMMDD = "YYYY-MM-dd";
	public static String formate_YYYYMMDDHHMMSS = "YYYY-MM-dd HH:mm:ss";
	
	/**
	 * 给出当前时间的日期字符串
	 * 字符串格式 DateUtils.formate_YYYYMMDDHHMMSS
	 * @author elven 2016年5月22日
	 */
	public static String getDetailCurrent(){
		return getCurrent(formate_YYYYMMDDHHMMSS);
	}
	
	/**
	 * 给出当前日期字符串
	 * 字符串格式 DateUtils.formate_YYYYMMDD
	 * @author elven 2016年5月22日
	 */
	public static String getCurrent(){
		return getCurrent(formate_YYYYMMDD);
	}
	
	/**
	 * 给出当前日期字符串
	 * @param format 字符串格式
	 * @author elven 2016年5月22日
	 */
	public static String getCurrent(String format){
		return new DateTime().toString(format);
	}

	/**
	 * 将日期字符串按照指定格式，转成日期
	 * @param dateString 日期字符串
	 * @param formatStr 字符串格式
	 * @author elven 2016年5月22日
	 */
	public static Date conver(String dateString, String formatStr){
		return DateTimeFormat.forPattern(formatStr).parseDateTime(dateString).toDate();
	}
	
	/**
	 * 将日期字符串以YYYYMMDD格式转成Date
	 * @param dateStr 日期字符串
	 * @author elven 2016年5月22日
	 */
	public static Date getSimple(String dateStr){
		return conver(dateStr, formate_YYYYMMDD);
	}
	
	/**
	 * 将日期字符串以YYYYMMDDHHMMSS转成日期
	 * @param dateStr 日期字符串
	 * @author elven 2016年5月22日
	 */
	public static Date getDetail(String dateStr){
		return conver(dateStr, formate_YYYYMMDDHHMMSS);
	}
	
	/**
	 * 将日期，按照指定格式进行格式化成字符串
	 * @param date 日期
	 * @param formate 日期字符串
	 * @author elven 2016年5月22日
	 */
	public static String conver(Date date, String formate){
		return new DateTime(date).toString(formate);
	}
	
	/**
	 * 格式化成日期字符串输出
	 * 字符串格式：DateUtils.formate_YYYYMMDDHHMMSS
	 * @param date
	 * @author elven 2016年5月22日
	 */
	public static String getDetail(Date date){
		return conver(date, formate_YYYYMMDDHHMMSS);
	}
	
	/**
	 * 格式化成日期字符串输出
	 * 字符串格式：DateUtils.formate_YYYYMMDD
	 * @param date
	 * @return
	 * @author elven 2016年5月22日
	 */
	public static String getSimple(Date date){
		return conver(date, formate_YYYYMMDD);
	}
	
	/**
	 * time1是否在time2之后
	 * @author elven
	 * @date 2016年4月25日
	 */
	public static boolean dateIsAfter(String time1, String time2){
		if(Utils.isEmpty(time1) || Utils.isEmpty(time2)){
			return false;
		}
		return new DateTime(time1).isAfter(new DateTime(time2));
	}
	
	/**
	 * time1是否与time2
	 * @author elven
	 * @date 2016年4月25日
	 */
	public static boolean dateIsEqual(String time1, String time2){
		if(Utils.isEmpty(time1) || Utils.isEmpty(time2)){
			return false;
		}
		return new DateTime(time1).isEqual(new DateTime(time2));
	}
	
	/**
	 * time1是否在time2之前
	 * @author elven
	 * @date 2016年4月25日
	 */
	public static boolean dateIsBefore(String time1, String time2){
		if(Utils.isEmpty(time1) || Utils.isEmpty(time2)){
			return false;
		}
		return new DateTime(time1).isBefore(new DateTime(time2));
	}
	
	/**
	 * time1是否小于等于 time2
	 * @author elven
	 * @date 2016年4月25日
	 */
	public static boolean dateLessThanEquals(String time1, String time2){
		if(Utils.isEmpty(time1) || Utils.isEmpty(time2)){
			return false;
		}
		return dateIsEqual(time1, time2) || dateIsBefore(time1, time2);
	}
	
	/**
	 * time1是否大于等于time2
	 * @author elven
	 * @date 2016年4月25日
	 */
	public static boolean dateGreaterThanEquals(String time1, String time2){
		return dateIsEqual(time1, time2) || dateIsAfter(time1, time2);
	}
	
	/**
	 * 给出两日期相差天数
	 * @author elven
	 * @date 2016年4月25日
	 */
	public static int datePeriod(String time1, String time2){
		return new Period(new DateTime(time1), new DateTime(time2), PeriodType.days()).getDays();
	}
	
	public static void main(String[] args) {
		System.out.println(DateUtils.dateLessThanEquals(getCurrent(), "2016-07-10"));
		System.out.println(DateUtils.datePeriod("2016-3-12", "2016-7-3"));
	}
	
}